package mashibing.freshman.class01;

/**
 * @author: Shelly
 * @create: 2023-01-04 10:40:57
 * @describe: 打印 int的32位二进制
 * 1.二进制
 * 2.位运算
 *  2.1 n << i = n* 2的i次方
 *  2.2 &
 *      1 & 1 = 1
 *      1 & 0 = 0
 *      0 & 0 = 0
 */
public class Code01_PrintBinary {
    /**
     * 打印 int的32位二进制
     * @param num
     */
    public static void printB(int num) {
        // int 一共32位
        // 31位最左：递减
        for (int i = 31; i >= 0; i--) {
            // num的第i位【二进制】和 1 << i 的第i位【二进制】进行&位运算
            System.out.print((num & (1 << i)) == 0 ? "0" : "1");//查看对应的位是否为1
        }
        System.out.println();
    }
    public static void main(String[] args) {
        /*int test = 345;
        printB(1<<8);
        printB(test);
        printB(test<<1);
        printB(test<<2);
        printB(test<<3);*/
//        printB(2);//00000000000000000000000000000010
//        System.out.println( 2 & 4);// 0  按位进行&运算，结果转10进制输出
//        System.out.println( 1 & 1);// 1
//        System.out.println( 1 & 0);// 0
//        System.out.println(1 << 2);// 4

//        int test = 1;
//        print(test << 1);// 00000000000000000000000000000010
//        print(test << 5);// 00000000000000000000000000100000
        // 最大值
//        int max_int = Integer.MAX_VALUE;
//        System.out.println(max_int);// 2147483647【21亿】
//        printB(max_int);// 01111111111111111111111111111111
//        // 最小值
        /*int min_int = Integer.MIN_VALUE;
        System.out.println(min_int);// -2147483648
        printB(min_int);// 10000000000000000000000000000000*/

//        int a = 5;
//        int b = ~a;// 取反
//        System.out.println(b);// -6
//        printB(a);// 00000000000000000000000000000101
//        printB(b);// 11111111111111111111111111111010

//        int c = 6;
//        int d = -6;
//        printB(c);// 00000000000000000000000000000110
//        printB(d);// 00000000000000000000000000000010
//        printB(c+d);// 00000000000000000000000000001000
//        printB(c-d);// 00000000000000000000000000000100
//        printB(c*d);// 00000000000000000000000000001100 乘除法的位运算不清楚
//        printB(c/d);// 00000000000000000000000000000011
//        printB(c | d);// 00000000000000000000000000000110 或（有1）
//        printB(c & d);// 00000000000000000000000000000010 与（全1）
//        printB(c ^ d);// 00000000000000000000000000000100 异或

        // 右移
//        int a = Integer.MIN_VALUE;
//        printB(a);
//        printB(a >> 1);// 符号位补
//        printB(a >>> 1);// 以0补
//        System.out.println("==========");
//        int b = Integer.MAX_VALUE;
//        printB(b);
//        printB(b >> 1);// 符号位补
//        printB(b >>> 1);// 以0补

        /*int c = 5;
        int d = -5;
        int e = ~c + 1;// 负数 = 取反 + 1
        printB(c);
        printB(d);
        printB(e);*/

        // 最小值取反 + 1 = 最小值。不算bug，一般数据到这，不能用int改用long
        /*int min_int = Integer.MIN_VALUE;
        printB(min_int);
        printB(~min_int + 1);*/

        // 0取反+1 = 0
        int zero = 0;
        printB(zero);
        printB(~zero + 1);


    }
}
